package com.my.ph.entity.media;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.my.ph.enums.CountryEnum;
import com.my.ph.enums.MediaTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.Accessors;

import java.util.List;
import java.util.Objects;

@Data
@Accessors(chain = true)
public class TVMovieDetail {

    private boolean adult; // 是否包含成人内容
    private String backdropPath; // 背景图片路径
    private List<Integer> episodeRunTime; // 每集时长列表
    private String runtime; // 时长 电影
    private String firstAirDate; // 首播日期
    private String releaseDate; // 上映日期 电影
    private List<Genre> genres; // 类型列表
    private String homepage; // 官方网站
    private int id; // 电视剧ID
    private boolean inProduction; // 是否正在制作
    private List<String> languages; // 语言列表
    private String lastAirDate; // 最后一集播出日期
    private LastEpisodeToAir lastEpisodeToAir; // 最后一集详情
    private String name; // 电视剧名称
    private String title;
    private Object nextEpisodeToAir; // 下一集详情（如果有的话）
    private List<Network> networks; // 播出网络列表
    private Integer numberOfEpisodes; // 总集数
    private Integer numberOfSeasons; // 季数
    private List<String> originCountry; // 原产国列表
    private String originZhCountryName; // 原产国列表
    private String originalLanguage; // 原始语言
    private String originalZhLanguage;
    private String originalTitle; // 原名称
    private String originalName; // 原始名称
    private String overview; // 简介
    private double popularity; // 流行度
    private String posterPath; // 海报路径
    private List<ProductionCompany> productionCompanies; // 制作公司列表
    private List<ProductionCountry> productionCountries; // 制作国家列表
    private List<Season> seasons; // 季列表
    private List<SpokenLanguage> spokenLanguages; // 对白语言列表
    private String status; // 状态（如Ended）
    private String tagline; // 标语
    private String type; // 类型
    private double voteAverage; // 平均评分
    private int voteCount; // 评分人数
    private String mediaType;
    private String imdbId;
    private List<AlternativeTitles> titles;
    // 导演
    private List<Credits> directingCredits;
    // 编剧
    private List<Credits> writingCredits;
    // 演员
    private List<Credits> actingCredits;

    public String getOriginalTitle() {
        return StrUtil.equals(mediaType, MediaTypeEnum.TV.getValue()) ? originalName : originalTitle;
    }

    public String getTitle() {
        return MediaTypeEnum.TV.is(mediaType) ? name : title;
    }

    public Integer getYear() {
        String yearDate = StrUtil.equals(mediaType, MediaTypeEnum.TV.getValue()) ? firstAirDate : releaseDate;
        return StrUtil.isBlank(yearDate) ? null : DateUtil.year(DateUtil.parse(yearDate, "yyyy-MM-dd"));
    }

    public String getEnTitle() {
        return getTitles() == null ? "" : getTitles().stream().filter(item -> StrUtil.equals(item.getIso_3166_1(), "US")).findFirst().map(TVMovieDetail.AlternativeTitles::getTitle).orElse(getTitles().stream().findFirst().map(TVMovieDetail.AlternativeTitles::getTitle).orElse(""));
    }

    @Data
    @AllArgsConstructor
    public static class Credits {
        private String name;
        private String originalName;

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Credits credits = (Credits) o;
            return Objects.equals(name, credits.name) &&
                    Objects.equals(originalName, credits.originalName);
        }
    }

    @Data
    public static class Genre {
        private int id; // 类型ID
        private String name; // 类型名称
    }

    @Data
    public static class LastEpisodeToAir {
        // Getters and Setters
        private int id; // 最后一集ID
        private String name; // 最后一集名称
        private String overview; // 最后一集简介
        private double voteAverage; // 最后一集平均评分
        private int voteCount; // 最后一集评分人数
        private String airDate; // 最后一集播出日期
        private int episodeNumber; // 最后一集集数
        private String episodeType; // 最后一集类型
        private String productionCode; // 生产代码
        private int runtime; // 最后一集时长
        private int seasonNumber; // 最后一集所在季数
        private int showId; // 电视剧ID
        private String stillPath; // 最后一集剧照路径

    }

    @Data
    public static class Network {
        private int id; // 网络ID
        private String logoPath; // 网络logo路径
        private String name; // 网络名称
        private String originCountry; // 网络所在国家
    }

    @Data
    public static class ProductionCompany {
        private int id; // 制作公司ID
        private String logoPath; // 制作公司logo路径
        private String name; // 制作公司名称
        private String originCountry; // 制作公司所在国家
    }

    @Data
    public static class ProductionCountry {
        private String iso_3166_1; // 国家代码
        private String name; // 国家名称
    }

    @Data
    public static class AlternativeTitles {
        private String iso_3166_1; // 国家代码
        private String title; // 名称
        private String type;
    }

    @Data
    public static class Season {
        private String airDate; // 季播出日期
        private int episodeCount; // 季集数
        private int id; // 季ID
        private String name; // 季名称
        private String overview; // 季简介
        private String posterPath; // 季海报路径
        private int seasonNumber; // 季数
        private double voteAverage; // 季平均评分
    }

    @Data
    public static class SpokenLanguage {
        private String englishName; // 英文名称
        private String iso_639_1; // 语言代码
        private String name; // 语言名称
    }

    public String getOriginZhCountryName() {
        return CollectionUtil.isNotEmpty(getOriginCountry()) ? CountryEnum.getName(getOriginCountry().get(0)) : null;
    }

}

